// console.log(123)
// 睡眠功能
// 如果我输入 sleep(毫秒数)
// 实现等待具体时间之后再执行某项功能

// 回调函数版本
// 封装者
// const cbSleep = (time, cb) => {
//   setTimeout(() => {
//     cb()
//   }, time)
// }
// 调用者
// cbSleep(1000, () => { console.log('11111,普通回调') })

// Promise 版本
// promise 是js对异步标准封装，将之前回调形式随意定义 cb 回调函数进行标准化
// 默认情况下，自动生成一个resolve的函数作为回调，不用封装者约定
// 默认情况下使用者，直接用.then就可以传入回调函数也不需要跟封装者沟通
// const promiseSleep = (time) => {
//   return new Promise((resolve, reject) => {
// Promise构造时传入一个回调函数，会在调用这个promise时马上执行
// 其实就是将之前要做的事情包裹起来
// Promise对象会提供一个自带的默认回调函数通常叫做resolove函数，可以再需要回调的时候执行即可，无需考虑使用者如何调用
// 拓展，其实还会给第二个默认回调进行错误的处理，在任何封装这觉得有问题的情况下执行，都会马上报错 一般叫 reject
//     if (!time) {
//       reject()
//     }
//     setTimeout(() => {
//       resolve()
//     }, time)
//   })
// }
// 调用者
// 所有的调用者，如果知道自己拿到一个promise对象，
// 就知道默认约定，回调函数写在.then里面

// promiseSleep(2000).then(() => {
//   console.log('这里是promise')
// }).catch(() => {
//   console.log('错误回调')
// })
// promiseSleep().then(() => {
//   console.log('这里是promise')
// }).catch(() => {
//   console.log('错误回调')
// })
// const myAxios = (options) => {
//   // 原生发送请求的步骤
//   const xhr = new XMLHttpRequest()
//   xhr.send()
//   xhr.onload = function() {
//     console.log(xhr.responseText)
//   }
// }

// myAxios({
//   method: 'get',
//   url: 'http://baidu.com'
// }).then(() => {
//   console.log('请求成功')
// })

// // 以下是一个极简模拟 axios 的封装演示
// 封装者
const myAxios = (options) => {
  return new Promise((resolve, reject) => {
    if (!options.method || !options.url) {
      reject()
    }
    // 原生发送请求的步骤
    const xhr = new XMLHttpRequest()
    xhr.send()
    xhr.onload = function() {
      // 请求真正有异步响应以后
      console.log(xhr.responseText)
      resolve(xhr.responseText)
    }
  })
}

// 调用者
myAxios({
  method: 'get',
  url: 'http://baidu.com'
}).then(() => {
  console.log('请求成功')
}).catch(() => {
  console.log('请求失败')
})

const a = function() {
  console.log(this)
}
a()
